package edu.ctbu.insurance.aop;

import edu.ctbu.insurance.bean.User;
import edu.ctbu.insurance.vo.Result;
import jakarta.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.lang.reflect.Method;

@Component
@Aspect
public class RolePermissionVerificationAspect {
    @Pointcut("@annotation(edu.ctbu.insurance.aop.PermissionVerification)")
    public void rolePermissionCheckPointCut() {

    }

    @Around("rolePermissionCheckPointCut()")
    public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
        //pjp.getSignature() 方法返回一个 Signature 对象，该对象封装了当前被代理方法的签名信息。Signature 是一个接口，它本身不提供太多直接可用的方法。
        Signature signature = pjp.getSignature();
        //将 Signature 对象强制类型转换为 MethodSignature，以便访问更多关于方法的信息，比如方法名、参数类型、返回类型等
        MethodSignature methodSignature = (MethodSignature) signature;
        Method executionMethod = methodSignature.getMethod();// 获取正在访问的方法

        RequestAttributes ra = RequestContextHolder.getRequestAttributes();//获取当前的请求对象
        //由于RequestAttributes是一个接口，需要将其转换为ServletRequestAttributes（这是Spring MVC提供的一个实现，用于Web环境）
        // 以便访问Servlet API中的HttpServletRequest和HttpServletResponse对象
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;//转换为ServletRequestAttributes，便于访问方法

        //获取请求对象
        HttpServletRequest request = sra.getRequest();

        //构造返回结果
        Result<Object> result = new Result<Object>();
        result.setMsg("权限不足");

        //获取请求对象中的session
        if( request.getSession().getAttribute("userRole") == null){//session中对象不存在
            return result;
        }

        //获取user对象
        User userRole = (User) request.getSession().getAttribute("userRole");

        //获取注解中的权限信息列表
        PermissionVerification annotation = executionMethod.getAnnotation(PermissionVerification.class);
        String[] roleIdList = annotation.roleList();

        //判断权限
        for (int i = 0; i < roleIdList.length; i++) {
            if(userRole.getUserRole().equals(roleIdList[i])){
                return pjp.proceed();//执行方法
            }
        }

        return result;
    }
}
